import tkinter as tk
from tkinter import ttk, filedialog, scrolledtext, messagebox
from logic import compress_images
import threading
import os ,sys

class ImageCompressorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Ez 图像压缩工具 & Ajie")
        self.root.geometry("600x500")  # 增加宽度以容纳单行格式选项
  
        # 输入路径选择区域
        ttk.Label(root, text="源路径:").grid(row=0, column=0, padx=5, pady=5, sticky="w")
        self.input_path_var = tk.StringVar()
        ttk.Entry(root, textvariable=self.input_path_var, width=50).grid(row=0, column=1, padx=5, pady=5)
        
        # 输入路径选择按钮
        ttk.Button(root, text="选择文件", command=self.select_input_file).grid(row=0, column=2, padx=5)
        ttk.Button(root, text="选择文件夹", command=self.select_input_folder).grid(row=0, column=3, padx=5)
        
        # 输出路径选择区域
        ttk.Label(root, text="目标路径:").grid(row=1, column=0, padx=5, pady=5, sticky="w")
        self.output_path_var = tk.StringVar()
        ttk.Entry(root, textvariable=self.output_path_var, width=50).grid(row=1, column=1, padx=5, pady=5)
        
        # 输出路径选择按钮
        ttk.Button(root, text="选择文件夹", command=self.select_output_folder).grid(row=1, column=2, padx=5)
        ttk.Button(root, text="使用源路径", command=self.use_input_path).grid(row=1, column=3, padx=5)
        
        # 压缩参数设置
        params_frame = ttk.LabelFrame(root, text="压缩设置")
        params_frame.grid(row=2, column=0, columnspan=4, padx=10, pady=10, sticky="we")
        
        ttk.Label(params_frame, text="质量 (1-100):").grid(row=0, column=0, padx=5, pady=5)
        self.quality_var = tk.IntVar(value=90)
        
        # 使用自定义命令确保滑块值为整数
        def on_quality_change(val):
            self.quality_var.set(round(float(val)))
        
        self.quality_scale = ttk.Scale(
            params_frame, 
            from_=1, 
            to=100, 
            variable=self.quality_var,
            command=on_quality_change,  # 添加自定义命令
            orient="horizontal", 
            length=200
        )
        self.quality_scale.grid(row=0, column=1, padx=5)
        
        # 使用StringVar显示整数质量值
        self.quality_display = tk.StringVar(value=str(self.quality_var.get()))
        ttk.Label(params_frame, textvariable=self.quality_display).grid(row=0, column=2, padx=5)
        
        # 跟踪质量变量变化，更新显示
        self.quality_var.trace_add("write", lambda *args: self.quality_display.set(str(self.quality_var.get())))
        
        ttk.Label(params_frame, text="线程数:").grid(row=1, column=0, padx=5, pady=5)
        self.thread_var = tk.IntVar(value=4)
        ttk.Combobox(params_frame, textvariable=self.thread_var, 
                    values=[1, 2, 4, 8, 16], width=5).grid(row=1, column=1, padx=5, sticky="w")
        
        # 覆盖选项
        self.overwrite_var = tk.BooleanVar(value=False)
        ttk.Checkbutton(
            params_frame, 
            text="覆盖已存在文件",
            variable=self.overwrite_var
        ).grid(row=1, column=2, padx=10, sticky="w")
        
        # 文件格式选择区域（单行显示）
        formats_frame = ttk.LabelFrame(root, text="图像格式")
        formats_frame.grid(row=3, column=0, columnspan=4, padx=10, pady=5, sticky="we")
        
        # 支持的格式列表
        self.formats = {
            'JPG': ['.jpg', '.jpeg'],
            'PNG': ['.png'],
            'BMP': ['.bmp'],
            'GIF': ['.gif'],
            'TIFF': ['.tiff']
        }
        
        # 格式选择状态变量
        self.format_vars = {
            'JPG': tk.BooleanVar(value=True),
            'PNG': tk.BooleanVar(value=True),
            'BMP': tk.BooleanVar(value=False),
            'GIF': tk.BooleanVar(value=False),
            'TIFF': tk.BooleanVar(value=False)
        }
        
        # 创建单行多选框
        for col, format_name in enumerate(self.formats.keys()):
            cb = ttk.Checkbutton(
                formats_frame, 
                text=format_name,
                variable=self.format_vars[format_name]
            )
            cb.grid(row=0, column=col, padx=5, pady=2, sticky="w")
        
        # 日志区域
        ttk.Label(root, text="操作日志:").grid(row=4, column=0, padx=5, pady=5, sticky="w")
        self.log_area = scrolledtext.ScrolledText(root, height=10)
        self.log_area.grid(row=5, column=0, columnspan=4, padx=10, pady=5, sticky="nsew")
        
        # 操作按钮
        btn_frame = ttk.Frame(root)
        btn_frame.grid(row=6, column=0, columnspan=4, pady=10)
        
        ttk.Button(btn_frame, text="开始压缩", command=self.start_compression).pack(side=tk.LEFT, padx=10)
        ttk.Button(btn_frame, text="清空日志", command=self.clear_log).pack(side=tk.LEFT, padx=10)
        
        # 配置网格布局权重
        root.columnconfigure(1, weight=1)
        root.rowconfigure(5, weight=1)
    
    def log_message(self, message):
        """向日志区域添加消息"""
        self.log_area.insert(tk.END, message + "\n")
        self.log_area.see(tk.END)
    
    def clear_log(self):
        """清空日志"""
        self.log_area.delete(1.0, tk.END)
    
    def select_input_file(self):
        """选择输入文件"""
        path = filedialog.askopenfilename()
        if path:
            self.input_path_var.set(path)
    
    def select_input_folder(self):
        """选择输入文件夹"""
        path = filedialog.askdirectory()
        if path:
            self.input_path_var.set(path)
    
    def select_output_folder(self):
        """选择输出文件夹"""
        path = filedialog.askdirectory()
        if path:
            self.output_path_var.set(path)
    
    def use_input_path(self):
        """使用源路径作为目标路径"""
        input_path = self.input_path_var.get()
        if input_path:
            if os.path.isfile(input_path):
                # 如果是文件，使用文件所在目录
                self.output_path_var.set(os.path.dirname(input_path))
            else:
                # 如果是目录，直接使用
                self.output_path_var.set(input_path)
    
    def get_selected_extensions(self):
        """获取选中的文件扩展名列表"""
        extensions = []
        for format_name, var in self.format_vars.items():
            if var.get():
                extensions.extend(self.formats[format_name])
        return extensions
    
    def start_compression(self):
        """启动压缩线程"""
        input_path = self.input_path_var.get()
        if not input_path:
            self.log_message("❌ 请先选择源路径！")
            return
            
        output_path = self.output_path_var.get()
        if not output_path:
            # 如果未指定目标路径，使用源路径
            output_path = os.path.dirname(input_path) if os.path.isfile(input_path) else input_path
            self.output_path_var.set(output_path)
            self.log_message(f"⚠ 未指定目标路径，将使用: {output_path}")
        
        # 确保目标路径存在
        if not os.path.exists(output_path):
            try:
                os.makedirs(output_path)
                self.log_message(f"📁 已创建目标文件夹: {output_path}")
            except Exception as e:
                self.log_message(f"❌ 无法创建目标文件夹: {str(e)}")
                return
        
        # 获取选中的文件格式
        extensions = self.get_selected_extensions()
        if not extensions:
            messagebox.showwarning("警告", "请至少选择一种文件格式！")
            return
        
        # 在独立线程中运行压缩
        threading.Thread(
            target=compress_images,
            args=(
                input_path,
                output_path,
                extensions,
                self.quality_var.get(),  # 使用整数值
                self.overwrite_var.get(),
                self.thread_var.get(),
                self.log_message
            ),
            daemon=True
        ).start()

if __name__ == "__main__":
    root = tk.Tk()

    # 设置应用程序图标（在打包环境和开发环境都有效）
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.dirname(os.path.abspath(__file__))
    icon_path = os.path.join(base_path, '52936.ico')
    if os.path.exists(icon_path):
        root.iconbitmap(icon_path)
    
    # 主题：cyborg,journal,darkly,flatly,solar,minty,litera,united,pulse,cosmo,lumen
    import ttkbootstrap
    style = ttkbootstrap.Style(theme='minty')

    app = ImageCompressorApp(root)
    root.mainloop()